package xnet

import (
	"gitee.com/shuohe/xutils"
	"gitee.com/shuohe/xutils/xlog"
)

//=============================================================================

type ITCPChannelCallback interface {
	// 设置所关注的连接
	SetChannel(ch *TCPChannel)

	// 在开始正常伺服之前的一次性回调。
	// 如果返回 error 表示遇到错误，连接将会被关闭。
	OnConnect() error

	// 在有完整的消息准备好时的回调。
	// 如果返回 error 表示遇到严重错误，需要关闭连接。
	OnMessage(msg []byte) error

	// 在连接即将关闭前的回调。
	OnClose()

	// 在网络 IO 发生错误时的回调。
	OnError(err error)
}

type DummyChannelCallback struct {
	Channel *TCPChannel
}

func (this *DummyChannelCallback) SetChannel(ch *TCPChannel) {
	this.Channel = ch
}

func (this *DummyChannelCallback) OnConnect() error {
	xlog.Info(this.Channel.FullName(), "is connected.")
	return nil
}

func (this *DummyChannelCallback) OnMessage(data []byte) error {
	xlog.Info(this.Channel.FullName(), "message arrived:", xutils.Bytes2String(data))
	return nil
}

func (this *DummyChannelCallback) OnClose() {
	xlog.Info(this.Channel.FullName(), "is closed.")
}

func (this *DummyChannelCallback) OnError(err error) {
	xlog.Errorfe(err, this.Channel.FullName()+" has error.")
}

//=============================================================================

type ITCPServerCallback interface {
	SetServer(s *TCPServer)
	OnListen()
	OnAccept(ch *TCPChannel) error
	OnClose()
}

type DummyServerCallback struct {
	Server *TCPServer
}

func (this *DummyServerCallback) SetServer(s *TCPServer) {
	this.Server = s
}

func (this *DummyServerCallback) OnListen() {
	xlog.Info("Listening at", this.Server.ListenAddr, "...")
}

func (this *DummyServerCallback) OnAccept(ch *TCPChannel) error {
	//xlog.Info(ch.FullName(), "from", ch.RemoteAddr(), "is accepted.")
	return nil
}

func (this *DummyServerCallback) OnClose() {
	xlog.Info("TCPServer is closed.")
}
